package interceptcrossing;

/**
 * Пересечение двух отрезков. Определяется наличием отрезков и точки пересечения.
 *
 * @author Igor Botyan
 */
public class Intersection implements Comparable<Intersection> {

	private Intercept first;
	private Intercept second;
	private Point point;

	/**
	 * Создание пересечения
	 *
	 * @param first  первый отрезок
	 * @param second второй отрезок
	 * @param point  точка их пересечения
	 * @throws NullPointerException если один из параметров не задан (равен null)
	 */
	public Intersection(Intercept first, Intercept second, Point point) {
		if (first == null) {
			throw new NullPointerException("First intercept cannot be null");
		}

		if (second == null) {
			throw new NullPointerException("Second intercept cannot be null");
		}

		if (point == null) {
			throw new NullPointerException("Intersection point cannot be null");
		}

		this.first = first;
		this.second = second;
		this.point = point;
	}

	/**
	 * Получение первого отрезка, определяющего пересечение
	 *
	 * @return первый отрезок, определяющий пересечение
	 */
	public Intercept first() {
		return this.first;
	}

	/**
	 * Получение второго отрезка, определяющего пересечение
	 *
	 * @return второй отрезок, определяющий пересечение
	 */
	public Intercept second() {
		return this.second;
	}

	/**
	 * Получение точки пересечения отрезков
	 *
	 * @return точка пересечения отрезков
	 */
	public Point point() {
		return this.point;
	}

	@Override
	public boolean equals(Object obj) {
		if (obj == null) {
			return false;
		}
		if (getClass() != obj.getClass()) {
			return false;
		}
		final Intersection other = (Intersection) obj;
		if (this.first != other.first && (this.first == null || !this.first.equals(other.first))) {
			return false;
		}
		if (this.second != other.second && (this.second == null || !this.second.equals(other.second))) {
			return false;
		}
		if (this.point != other.point && (this.point == null || !this.point.equals(other.point))) {
			return false;
		}
		return true;
	}

	@Override
	public int hashCode() {
		int hash = 5;
		hash = 41 * hash + (this.first != null ? this.first.hashCode() : 0);
		hash = 41 * hash + (this.second != null ? this.second.hashCode() : 0);
		hash = 41 * hash + (this.point != null ? this.point.hashCode() : 0);
		return hash;
	}

	@Override
	public String toString() {
		return String.format("{%s, %s, %s}", this.point.toString(),
			this.first.toString(), this.second.toString());
	}

	public int compareTo(Intersection o) {
		return this.point.compareTo(o.point);
	}
}
